package com.arron.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Classname ReflectDemo
 * @Date 2020/8/28 14:47
 * @Created by 刘
 */
public class ReflectDemo {

    public static void main(String[] args) throws Exception {

        //正常创建类
//        App app = new App();
//        System.out.println(app);

        ReflectDemo reflectDemo = new ReflectDemo();

        Class clazz = reflectDemo.getClass().getClassLoader().loadClass("com.arron.reflect.App");
        //使用反射创建类
//        Class<App> appClass = App.class;
        Class<?> aClass = Class.forName("com.arron.reflect.App");
//        //拿到方法
//        Method setCode = appClass.getMethod("setCode", int.class);
//        Method getCode = aClass.getMethod("getCode");
//        //拿到构造器
//        Constructor[] constructors = appClass.getConstructors();
//        //拿到无参构造器
//        Constructor constructor = appClass.getConstructor();
//        //拿到有参构造器
//        Constructor constructor1 = appClass.getConstructor(int.class);
//
//        //创建无参对象
//        App o = (App) constructor.newInstance();
//
//        //创建有参
//        App o1 = (App) constructor1.newInstance(2);
//        System.out.println("==============创建有参/无参对象===============");
//        System.out.println(o);
//        System.out.println(o1);
//
//        System.out.println("===========调用反射方法==================");
//        //调用反射方法
//        setCode.invoke(o, 2);
//
//        System.out.println();
//        Object o2 = getCode.invoke(o);
//
//        System.out.println(o2.toString());
//        /**
//         * 创建代理对象
//         */
//        StartProxy startProxy = new StartProxy(new RealStart());
//        System.out.println("=======创建代理对象============");
//        System.out.println("应用程序加载器："+ClassLoader.getSystemClassLoader());
//        Start o3 = (Start) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Start.class}, startProxy);
//
//        o3.collectMoney();
//        o3.bookTicket();
//        o3.confer();
//        o3.sing();


    }

}
